package com.cskaoyan.javase.doublearray.yanghui;

/**
 * @description: 打印杨辉三角
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.util.Arrays;

/**
 * 1
 * 1 1
 * 1 2 1
 * 1 3 3 1
 * 1 4 6 4 1
 * 1 5 10 10 5 1
 * ...
 *
 * 观察杨辉三角的规律：每一行的第一列，和最后一列都是1
 * 从第三行开始，除了两边的是1，中间元素 = 同列的上一行元素 + 上一行左边一列的元素
 *
 * 杨辉三角和二维数组的关系：
 * 假设我们把每一行作为一个数组，杨辉三角相当于很多个一维数组，也就是二维数组
 * arr[i][j] = arr[i-1][j] + arr[i-1][j-1]
 *
 *
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        yangHuiTriangle(10);
    }


    //打印杨辉三角的方法
    public static void yangHuiTriangle(int length) {
        //创建一个二维数组
        //思考：应该用什么方式初始化二维数组
        //这里只能用动态初始化中 初始化m的
        int[][] arr = new int[length][];
        //然后立刻给二维数组中的一维数组 初始化长度
        for (int i = 0; i < arr.length; i++) {
            arr[i] = new int[i + 1];
        }


        //下一步做什么？
        //把每一个小数组中的第一个元素和最后一个元素赋值为1
        //遍历所有的小数组
        for (int i = 0; i < arr.length; i++) {
            //给数组中第一个元素赋值为1
            arr[i][0] = 1;
            //给数组中的最后一个元素赋值为1
            arr[i][arr[i].length - 1] = 1;
        }

        //其他的中间，非两边的元素赋值
        //同样还要遍历每个小数组
        //从第三行开始，所以i=2
        for (int i = 2; i < arr.length; i++) {
            //这里拿到的是每一个小数组
            //你想要赋值，这边要遍历小数组
            //因为小数组的首元素和末尾元素都已经是1了，遍历的时候去掉这两个元素
            for (int j = 1; j < arr[i].length - 1; j++) {

                arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
            }
        }
        //System.out.println(Arrays.deepToString(arr));

        //最后一步，把这个二维数组，用杨辉三角的形式输出
        //遍历二维数组
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                //打印小数组中的元素
                System.out.print(arr[i][j] + "\t");
            }
            //每遍历完一个小数组应该换行
            System.out.println();
        }


    }

}
